package com.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.common.BaseModel;

@SuppressWarnings("serial")
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class OrdenDeCompra extends BaseModel {

	@Id
	@SequenceGenerator(name = "id", sequenceName = "OrdenDeCompraSEQ")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
	@Column(unique = true)
	private Long id;

	private Long numeroOrdenDeCompra;
	
	@OneToOne
	private Cliente cliente;
	
	@OneToOne
	private Proveedor proveedor;

	//@OneToOne
	//private Deposito deposito;

	@OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumn(name = "ordenDeCompraID")
	private List<OrdenDeCompraDetalle> listaDetalleOrdenDeCompra;	
		
	@OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumn(name = "ordenDeCompraID")
	private List<Remito> listaDeRemitos;	

	@Basic
	private Date fechaOrdenDeCompra;

	@Basic
	private Date fechaCreadaOrdenDeCompra;
	@Basic
	private Date fechaAutorizadaOrdenDeCompra;
	@Basic
	private Date fechaCierreOrdenDeCompra;

	private String estado; // enum
	
	@Column(precision = 20, scale = 2)
	private BigDecimal total;
	
	@Column(precision = 20, scale = 2)
	private BigDecimal totalRecepcionado;
	
	public OrdenDeCompra(Long id, Long numeroOrdenDeCompra, Proveedor proveedor, List<OrdenDeCompraDetalle> listaDetalleOrdenDeCompra,
					Date fechaOrdenDeCompra, String estado, Date fechaCreadaOrdenDeCompra, Date fechaAutorizadaOrdenDeCompra,
					Date fechaCierreOrdenDeCompra, List<Remito> listaDeRemitos, Cliente cliente, BigDecimal total, BigDecimal totalRecepcionado) {
		this.id = id;
		this.proveedor = proveedor;
		this.numeroOrdenDeCompra = numeroOrdenDeCompra;
		this.listaDetalleOrdenDeCompra = listaDetalleOrdenDeCompra;
		this.fechaOrdenDeCompra = fechaOrdenDeCompra;
		this.estado = estado;
		this.fechaAutorizadaOrdenDeCompra = fechaAutorizadaOrdenDeCompra;
		this.fechaCreadaOrdenDeCompra = fechaCreadaOrdenDeCompra;
		this.fechaCierreOrdenDeCompra = fechaCierreOrdenDeCompra;
		this.listaDeRemitos = listaDeRemitos;
		this.cliente = cliente;
		//this.deposito = deposito;
		this.total = total;
		this.totalRecepcionado = totalRecepcionado;
	}

	public OrdenDeCompra() {
		this(null,  null, new Proveedor(), new ArrayList<OrdenDeCompraDetalle>(), 
				null, null, null, null, null, new ArrayList<Remito>(), new Cliente(), BigDecimal.ZERO, BigDecimal.ZERO);
	}

	public Long getID() {
		return id;
	}

	public void setID(Long id) {
		this.id = id;
	}

	public Long getNumeroOrdenDeCompra() {
		return numeroOrdenDeCompra;
	}

	public void setNumeroOrdenDeCompra(Long numeroOrdenDeCompra) {
		this.numeroOrdenDeCompra = numeroOrdenDeCompra;
	}

	public Proveedor getProveedor() {
		return proveedor;
	}

	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}

	public List<OrdenDeCompraDetalle> getListaDetalleOrdenDeCompra() {
		return listaDetalleOrdenDeCompra;
	}

	public void setListaDetalleOrdenDeCompra(
			List<OrdenDeCompraDetalle> listaDetalleOrdenDeCompra) {
		this.listaDetalleOrdenDeCompra = listaDetalleOrdenDeCompra;
	}

	public Date getFechaOrdenDeCompra() {
		return fechaOrdenDeCompra;
	}

	public void setFechaOrdenDeCompra(Date fechaOrdenDeCompra) {
		this.fechaOrdenDeCompra = fechaOrdenDeCompra;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Date getFechaCreadaOrdenDeCompra() {
		return fechaCreadaOrdenDeCompra;
	}

	public void setFechaCreadaOrdenDeCompra(Date fechaCreadaOrdenDeCompra) {
		this.fechaCreadaOrdenDeCompra = fechaCreadaOrdenDeCompra;
	}

	public Date getFechaAutorizadaOrdenDeCompra() {
		return fechaAutorizadaOrdenDeCompra;
	}

	public void setFechaAutorizadaOrdenDeCompra(Date fechaAutorizadaOrdenDeCompra) {
		this.fechaAutorizadaOrdenDeCompra = fechaAutorizadaOrdenDeCompra;
	}

	public Date getFechaCierreOrdenDeCompra() {
		return fechaCierreOrdenDeCompra;
	}

	public void setFechaCierreOrdenDeCompra(Date fechaCierreOrdenDeCompra) {
		this.fechaCierreOrdenDeCompra = fechaCierreOrdenDeCompra;
	}

	public List<Remito> getListaDeRemitos() {
		return listaDeRemitos;
	}

	public void setListaDeRemitos(List<Remito> listaDeRemitos) {
		this.listaDeRemitos = listaDeRemitos;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public BigDecimal getTotal() {
		return total;
	}

	public void setTotal(BigDecimal total) {
		this.total = total;
	}

	public BigDecimal getTotalRecepcionado() {
		return totalRecepcionado;
	}

	public void setTotalRecepcionado(BigDecimal totalRecepcionado) {
		this.totalRecepcionado = totalRecepcionado;
	}

//	public Deposito getDeposito() {
//		return deposito;
//	}
//
//	public void setDeposito(Deposito deposito) {
//		this.deposito = deposito;
//	}
	
}
